﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace sy5_13
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            this.Text = "成绩统计"; // 设置窗体标题
            this.Size = new Size(400, 300); // 调整窗体大小
        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }

        private void button1_Click(object sender, EventArgs e)
        {
            this.Refresh();
            Graphics g = this.CreateGraphics();
            g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias; // 抗锯齿

            // 2. 坐标系参数（按实验提示设置）
            int x0 = 20; // 原点x坐标
            int y0 = this.ClientSize.Height - 40; // 原点y坐标
            int w = this.ClientSize.Width - 30; // x轴长度
            int h = this.ClientSize.Height - 50; // y轴长度

            // 3. 平移坐标系到(x0, y0)
            g.TranslateTransform(x0, y0);

            // 4. 绘制坐标轴（x轴、y轴）
            Pen axisPen = new Pen(Color.Black, 2);
            g.DrawLine(axisPen, 0, 0, w, 0); // x轴
            g.DrawLine(axisPen, 0, 0, 0, -h); // y轴（向上）

            // 5. 随机生成10个成绩（0~100）
            Random ran = new Random();
            int[] scores = new int[10];
            for (int i = 0; i < 10; i++)
            {
                scores[i] = ran.Next(0, 101); // 生成0~100的随机成绩
            }

            // 6. 计算散点图的放大倍数bl（实验公式：bl=(h-20)/100）
            float bl = (h - 20) / 100.0f;

            // 7. 绘制刻度线（每隔20分绘制一条横向短线）
            Pen scalePen = new Pen(Color.Gray, 1);
            for (int score = 0; score <= 100; score += 20)
            {
                float y = -score * bl; // 刻度对应的y坐标（向上）
                g.DrawLine(scalePen, 0, y, 5, y); // 刻度短线
                g.DrawString(score.ToString(), new Font("宋体", 8), Brushes.Black, -20, y - 5); // 刻度文字
            }

            // 8. 绘制散点图（每个成绩对应6×6的矩形）
            int pointWidth = 6; // 散点宽度
            int pointHeight = 6; // 散点高度
            float xStep = (w - 20) / 10.0f; // 散点的x轴间距（10个成绩均分x轴）

            // 统计变量：优良（≥80）、合格（60~79）、不合格（<60）
            int excellent = 0, pass = 0, fail = 0;

            for (int i = 0; i < 10; i++)
            {
                int score = scores[i];
                // 统计成绩等级
                if (score >= 80) excellent++;
                else if (score >= 60) pass++;
                else fail++;

                // 计算散点的坐标
                float x = (i + 1) * xStep; // 第i个散点的x坐标
                float y = -score * bl; // 散点的y坐标（向上）

                // 绘制散点（6×6矩形）
                Rectangle pointRect = new Rectangle(
                    (int)(x - pointWidth / 2),
                    (int)(y - pointHeight / 2),
                    pointWidth,
                    pointHeight
                );
                // 不同等级用不同颜色：优良（绿）、合格（红）、不合格（蓝）
                Brush pointBrush = score >= 80 ? Brushes.Green : (score >= 60 ? Brushes.Red : Brushes.Blue);
                g.FillRectangle(pointBrush, pointRect);
                g.DrawString(score.ToString(), new Font("宋体", 8), Brushes.Black, x + 5, y - 5); // 成绩文字
            }

            // 9. 计算并显示统计率（百分比）
            float excellentRate = (excellent / 10.0f) * 100;
            float passRate = (pass / 10.0f) * 100;
            float failRate = (fail / 10.0f) * 100;
            label1.Text = $"优良率：{excellentRate}%";
            label2.Text = $"合格率：{passRate}%";
            label3.Text = $"不合格率：{failRate}%";

            // 10. 释放资源
            axisPen.Dispose();
            scalePen.Dispose();
            g.Dispose();
        }
    }
}
